package co.edu.usbcali.banco.presentation.backEndBeans;

import co.edu.usbcali.banco.exceptions.*;
import co.edu.usbcali.banco.modelo.*;
import co.edu.usbcali.banco.modelo.dto.ClienteDTO;
import co.edu.usbcali.banco.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.banco.utilities.*;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlCommandLink;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlOutputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;

import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;

/**
 * 
 * 
 * @author Zathura Code Generator http://code.google.com/p/zathura
 * 
 */
public class ClienteView extends DataSource implements Renderable,
		DisposableBean {
	private HtmlInputText txtApellidocliente;
	private HtmlInputText txtCorreo;
	private HtmlInputText txtDireccion;
	private HtmlInputText txtNombrecliente;
	private HtmlInputText txtTelefono;
	private HtmlInputText txtCodigoestado_Estado;
	private HtmlInputText txtCodigosucursal_Sucursal;
	private HtmlSelectOneMenu txtCodigotipodocumento_TipoDocumento;
	private HtmlInputText txtCedulacliente;
	private HtmlSelectOneMenu cbmSucursal;
	private HtmlCommandButton btnSave;
	private HtmlCommandButton btnModify;
	private HtmlCommandButton btnDelete;
	private HtmlCommandButton btnClear;
	private boolean renderDataTable;
	private boolean flag = true;
	private RenderManager renderManager;
	private PersistentFacesState state = PersistentFacesState.getInstance();
	private List<Cliente> cliente;
	private List<ClienteDTO> clienteDTO;
	private List<SelectItem> listSucursal = new ArrayList<SelectItem>();

	// creados
	private Boolean popupVisible;
	private List<SelectItem> list_tipos = new ArrayList<SelectItem>();
	private List<TipoDocumento> tipos = new ArrayList<TipoDocumento>();
	private HtmlCommandButton btnLupa;
	private HtmlCommandLink cmlSucursal;
	private HtmlOutputText cmlCliente;
	private List<Sucursal> dataSucursales = new ArrayList<Sucursal>();

	public ClienteView() {
		super("");
	}

	public String action_abrir() {
		popupVisible = true;
		try {
			dataSucursales.clear();
			dataSucursales = BusinessDelegatorView.getSucursal();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return "";
	}

	public String action_cerrar() {
		popupVisible = false;
		return "";
	}
	public String action_put() {
		txtCodigosucursal_Sucursal.setValue(cmlSucursal.getValue().toString());
		action_cerrar();
		return "";
	}
	public String action_cargar() {

		Cliente entity = null;

		try {
			Long cedulacliente = new Long(cmlCliente.getValue()
					.toString());
			entity = BusinessDelegatorView.getCliente(cedulacliente);
		} catch (Exception e) {
			// TODO: handle exception
		}

		if (entity == null) {
			txtApellidocliente.setDisabled(false);
			txtCorreo.setDisabled(false);
			txtDireccion.setDisabled(false);
			txtNombrecliente.setDisabled(false);
			txtTelefono.setDisabled(false);
			txtCodigotipodocumento_TipoDocumento.setDisabled(false);
			txtCedulacliente.setDisabled(false);
			cbmSucursal.setDisabled(false);
			btnSave.setDisabled(false);
			btnDelete.setDisabled(true);
			btnModify.setDisabled(true);
			btnClear.setDisabled(false);
		} else {
			txtApellidocliente.setValue(entity.getApellidocliente());
			txtApellidocliente.setDisabled(false);
			txtCorreo.setValue(entity.getCorreo());
			txtCorreo.setDisabled(false);
			txtDireccion.setValue(entity.getDireccion());
			txtDireccion.setDisabled(false);
			txtNombrecliente.setValue(entity.getNombrecliente());
			txtNombrecliente.setDisabled(false);
			txtTelefono.setValue(entity.getTelefono());
			txtTelefono.setDisabled(false);
			txtCodigotipodocumento_TipoDocumento.setValue(entity
					.getTipoDocumento().getCodigotipodocumento());
			txtCodigotipodocumento_TipoDocumento.setDisabled(false);
			txtCedulacliente.setValue(entity.getCedulacliente());
			cbmSucursal.setValue(entity.getSucursal().getCodigosucursal());
			cbmSucursal.setReadonly(true);
			txtCedulacliente.setDisabled(true);
			btnSave.setDisabled(true);
			btnDelete.setDisabled(false);
			btnModify.setDisabled(false);
			btnClear.setDisabled(false);
		}
		
		return "";
	}

	public String action_clear() {
		txtApellidocliente.setValue(null);
		txtApellidocliente.setDisabled(true);
		txtCorreo.setValue(null);
		txtCorreo.setDisabled(true);
		txtDireccion.setValue(null);
		txtDireccion.setDisabled(true);
		txtNombrecliente.setValue(null);
		txtNombrecliente.setDisabled(true);
		txtTelefono.setValue(null);
		txtTelefono.setDisabled(true);
		cbmSucursal.setValue(0);
		cbmSucursal.setDisabled(true);
		txtCodigotipodocumento_TipoDocumento.setValue(0);
		txtCodigotipodocumento_TipoDocumento.setDisabled(true);
		txtCedulacliente.setValue(null);
		txtCedulacliente.setDisabled(false);
		btnSave.setDisabled(true);
		btnDelete.setDisabled(true);
		btnModify.setDisabled(true);
		btnClear.setDisabled(false);

		return "";
	}

	public void listener_txtId(ValueChangeEvent event) {
		if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
			Cliente entity = null;

			try {
				Long cedulacliente = new Long(txtCedulacliente.getValue()
						.toString());
				entity = BusinessDelegatorView.getCliente(cedulacliente);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {
				txtApellidocliente.setDisabled(false);
				txtCorreo.setDisabled(false);
				txtDireccion.setDisabled(false);
				txtNombrecliente.setDisabled(false);
				txtTelefono.setDisabled(false);
				txtCodigotipodocumento_TipoDocumento.setDisabled(false);
				txtCedulacliente.setDisabled(false);
				cbmSucursal.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				txtApellidocliente.setValue(entity.getApellidocliente());
				txtApellidocliente.setDisabled(false);
				txtCorreo.setValue(entity.getCorreo());
				txtCorreo.setDisabled(false);
				txtDireccion.setValue(entity.getDireccion());
				txtDireccion.setDisabled(false);
				txtNombrecliente.setValue(entity.getNombrecliente());
				txtNombrecliente.setDisabled(false);
				txtTelefono.setValue(entity.getTelefono());
				txtTelefono.setDisabled(false);
				txtCodigotipodocumento_TipoDocumento.setValue(entity
						.getTipoDocumento().getCodigotipodocumento());
				txtCodigotipodocumento_TipoDocumento.setDisabled(false);
				txtCedulacliente.setValue(entity.getCedulacliente());
				txtCedulacliente.setDisabled(true);
				cbmSucursal.setValue(entity.getSucursal().getCodigosucursal());
				cbmSucursal.setDisabled(false);
				cbmSucursal.setReadonly(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
	}

	public String action_save() {
		try {
			String id = txtCedulacliente.getValue().toString();
			String tipo = txtCodigotipodocumento_TipoDocumento.getValue()
					.toString();
			String nombre = txtNombrecliente.getValue().toString();
			String apellido = txtApellidocliente.getValue().toString();
			String correo = txtCorreo.getValue().toString();
			String direccion = txtDireccion.getValue().toString();
			String telefono = txtTelefono.getValue().toString();
			String sucursal = cbmSucursal.getValue().toString();
			String estado = "1";

			if (!Utilities.soloNumeros(id)) {
				throw new Exception(
						"El Numero de identificacion del cliente debe ser totalmente numerico");
			}
			if (id.trim().equals("")) {
				throw new Exception(
						"El Numero de identificacion del cliente es de caracter obligatorio");
			}
			if (tipo.trim().equals("") || tipo.equals("0")) {
				throw new Exception(
						"El Tipo de identificacion del cliente es de caracter obligatorio, debes seleccionar alguno");
			}
			if (!Utilities.soloLetras(nombre)) {
				throw new Exception(
						"El Nombre del cliente debe contener solo letras");
			}
			if (nombre.trim().equals("")) {
				throw new Exception(
						"El Nombre del cliente es de caracter obligatorio");
			}
			if (!Utilities.soloLetras(apellido)) {
				throw new Exception(
						"El apellido del cliente debe contener solo letras");
			}
			if (apellido.trim().equals("")) {
				throw new Exception(
						"El apellido del cliente es de caracter obligatorio");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception(
						"El correo electronico del cliente debe tener el siguiente formato \"xxx@xxx.xxx\"");
			}
			if (correo.trim().equals("")) {
				throw new Exception(
						"El correo electronico del cliente es de caracter obligatorio");
			}
			if (direccion.trim().equals("")) {
				throw new Exception(
						"La direccion del cliente es de caracter obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception(
						"El Telefono del cliente debe ser totalmente numerico");
			}
			if (telefono.trim().equals("")) {
				throw new Exception(
						"El telefono del cliente es de caracter obligatorio");
			}
			if (sucursal.trim().equals("") || sucursal.trim().equals(0)) {
				throw new Exception(
						"La sucursal del cliente es de caracter obligatorio, debes seleccionar alguna");
			}
			BusinessDelegatorView.saveCliente(apellido, new Long(id), correo,
					direccion, nombre, new Long(telefono), estado, sucursal,
					tipo);

			FacesUtils.addInfoMessage("Cliente almacenado correctamente.");
			//renderManager.getOnDemandRenderer("ClienteView").requestRender();
			getData();
			renderManager.getOnDemandRenderer("ClienteView").requestRender();
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete() {
		try {
			String id = txtCedulacliente.getValue().toString();
			String tipo = txtCodigotipodocumento_TipoDocumento.getValue()
					.toString();
			String nombre = txtNombrecliente.getValue().toString();
			String apellido = txtApellidocliente.getValue().toString();
			String correo = txtCorreo.getValue().toString();
			String direccion = txtDireccion.getValue().toString();
			String telefono = txtTelefono.getValue().toString();
			String sucursal = cbmSucursal.getValue().toString();
			String estado = "3";

			if (!Utilities.soloNumeros(id)) {
				throw new Exception(
						"El Numero de identificacion del cliente debe ser totalmente numerico");
			}
			if (id.trim().equals("")) {
				throw new Exception(
						"El Numero de identificacion del cliente es de caracter obligatorio");
			}
			if (tipo.trim().equals("") || tipo.equals("0")) {
				throw new Exception(
						"El Tipo de identificacion del cliente es de caracter obligatorio, debes seleccionar alguno");
			}
			if (!Utilities.soloLetras(nombre)) {
				throw new Exception(
						"El Nombre del cliente debe contener solo letras");
			}
			if (nombre.trim().equals("")) {
				throw new Exception(
						"El Nombre del cliente es de caracter obligatorio");
			}
			if (!Utilities.soloLetras(apellido)) {
				throw new Exception(
						"El apellido del cliente debe contener solo letras");
			}
			if (apellido.trim().equals("")) {
				throw new Exception(
						"El apellido del cliente es de caracter obligatorio");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception(
						"El correo electronico del cliente debe tener el siguiente formato \"xxx@xxx.xxx\"");
			}
			if (correo.trim().equals("")) {
				throw new Exception(
						"El correo electronico del cliente es de caracter obligatorio");
			}
			if (direccion.trim().equals("")) {
				throw new Exception(
						"La direccion del cliente es de caracter obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception(
						"El Telefono del cliente debe ser totalmente numerico");
			}
			if (telefono.trim().equals("")) {
				throw new Exception(
						"El telefono del cliente es de caracter obligatorio");
			}
			if (sucursal.trim().equals("") || sucursal.trim().equals(0)) {
				throw new Exception(
						"La sucursal del cliente es de caracter obligatorio, debes seleccionar alguna");
			}
			BusinessDelegatorView.updateCliente(apellido, new Long(id), correo,
					direccion, nombre, new Long(telefono), estado, sucursal,
					tipo);

			FacesUtils.addInfoMessage("Cliente Inactivado correctamente.");
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			String id = txtCedulacliente.getValue().toString();
			String tipo = txtCodigotipodocumento_TipoDocumento.getValue()
					.toString();
			String nombre = txtNombrecliente.getValue().toString();
			String apellido = txtApellidocliente.getValue().toString();
			String correo = txtCorreo.getValue().toString();
			String direccion = txtDireccion.getValue().toString();
			String telefono = txtTelefono.getValue().toString();
			String sucursal = cbmSucursal.getValue().toString();
			String estado = "1";

			if (!Utilities.soloNumeros(id)) {
				throw new Exception(
						"El Numero de identificacion del cliente debe ser totalmente numerico");
			}
			if (id.trim().equals("")) {
				throw new Exception(
						"El Numero de identificacion del cliente es de caracter obligatorio");
			}
			if (tipo.trim().equals("") || tipo.equals("0")) {
				throw new Exception(
						"El Tipo de identificacion del cliente es de caracter obligatorio, debes seleccionar alguno");
			}
			if (!Utilities.soloLetras(nombre)) {
				throw new Exception(
						"El Nombre del cliente debe contener solo letras");
			}
			if (nombre.trim().equals("")) {
				throw new Exception(
						"El Nombre del cliente es de caracter obligatorio");
			}
			if (!Utilities.soloLetras(apellido)) {
				throw new Exception(
						"El apellido del cliente debe contener solo letras");
			}
			if (apellido.trim().equals("")) {
				throw new Exception(
						"El apellido del cliente es de caracter obligatorio");
			}
			if (!Utilities.correElectronico(correo)) {
				throw new Exception(
						"El correo electronico del cliente debe tener el siguiente formato \"xxx@xxx.xxx\"");
			}
			if (correo.trim().equals("")) {
				throw new Exception(
						"El correo electronico del cliente es de caracter obligatorio");
			}
			if (direccion.trim().equals("")) {
				throw new Exception(
						"La direccion del cliente es de caracter obligatorio");
			}
			if (!Utilities.soloNumeros(telefono)) {
				throw new Exception(
						"El Telefono del cliente debe ser totalmente numerico");
			}
			if (telefono.trim().equals("")) {
				throw new Exception(
						"El telefono del cliente es de caracter obligatorio");
			}
			if (sucursal.trim().equals("") || sucursal.trim().equals(0)) {
				throw new Exception(
						"La sucursal del cliente es de caracter obligatorio, debes seleccionar alguna");
			}
			BusinessDelegatorView.updateCliente(apellido, new Long(id), correo,
					direccion, nombre, new Long(telefono), estado, sucursal,
					tipo);

			FacesUtils.addInfoMessage("Cliente modificado correctamente.");
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(String apellidocliente,
			Long cedulacliente, String correo, String direccion,
			String nombrecliente, Long telefono, String codigoestado_Estado,
			String codigosucursal_Sucursal,
			String codigotipodocumento_TipoDocumento) throws Exception {
		try {
			BusinessDelegatorView.updateCliente(apellidocliente, cedulacliente,
					correo, direccion, nombrecliente, telefono,
					codigoestado_Estado, codigosucursal_Sucursal,
					codigotipodocumento_TipoDocumento);
			renderManager.getOnDemandRenderer("ClienteView").requestRender();
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			// renderManager.getOnDemandRenderer("ClienteView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public List<Cliente> getCliente() {
		if (flag) {
			try {
				cliente = BusinessDelegatorView.getCliente();
				flag = false;
			} catch (Exception e) {
				flag = true;
				FacesUtils.addErrorMessage(e.getMessage());
			}
		}

		return cliente;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setCliente(List<Cliente> cliente) {
		this.cliente = cliente;
	}

	public boolean isRenderDataTable() {
		try {
			if (flag) {
				if (BusinessDelegatorView.findTotalNumberCliente() > 0) {
					renderDataTable = true;
				} else {
					renderDataTable = false;
				}
			}

			flag = false;
		} catch (Exception e) {
			renderDataTable = false;
			e.printStackTrace();
		}

		return renderDataTable;
	}

	public DataModel getData() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModel(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and returned
	 * as a list of objects for display in the UI.
	 */
	private DataPage<Cliente> getDataPage(int startRow, int pageSize) {
		// Retrieve the total number of objects from the database. This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberCliente = 0;

		try {
			totalNumberCliente = BusinessDelegatorView.findTotalNumberCliente()
					.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberCliente) {
			endIndex = totalNumberCliente;
		}

		try {
			cliente = BusinessDelegatorView.findPageCliente(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			// Remove this Renderable from the existing render groups.
			// leaveRenderGroups();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		// joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate. If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<Cliente>(totalNumberCliente, startRow, cliente);
	}

	public DataModel getDataDTO() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModelDTO(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and returned
	 * as a list of objects for display in the UI.
	 */
	private DataPage<ClienteDTO> getDataPageDTO(int startRow, int pageSize) {
		// Retrieve the total number of objects from the database. This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberCliente = 0;

		try {
			totalNumberCliente = BusinessDelegatorView.findTotalNumberCliente()
					.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberCliente) {
			endIndex = totalNumberCliente;
		}

		try {
			cliente = BusinessDelegatorView.findPageCliente(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			if (Utilities.validationsList(cliente)) {
				clienteDTO = new ArrayList<ClienteDTO>();

				for (Cliente clienteTmp : cliente) {
					ClienteDTO clienteDTO2 = new ClienteDTO();
					clienteDTO2.setCedulacliente(clienteTmp.getCedulacliente()
							.toString());
					clienteDTO2.setApellidocliente((clienteTmp
							.getApellidocliente() != null) ? clienteTmp
							.getApellidocliente().toString() : null);
					clienteDTO2
							.setCorreo((clienteTmp.getCorreo() != null) ? clienteTmp
									.getCorreo().toString()
									: null);
					clienteDTO2
							.setDireccion((clienteTmp.getDireccion() != null) ? clienteTmp
									.getDireccion().toString()
									: null);
					clienteDTO2
							.setNombrecliente((clienteTmp.getNombrecliente() != null) ? clienteTmp
									.getNombrecliente().toString()
									: null);
					clienteDTO2
							.setTelefono((clienteTmp.getTelefono() != null) ? clienteTmp
									.getTelefono().toString()
									: null);
					Estado estado = BusinessDelegatorView.getEstado(clienteTmp.getEstado()
							.getCodigoestado());
					clienteDTO2.setCodigoestado_Estado(estado.getNombreestado());
					clienteDTO2
							.setCodigosucursal_Sucursal((clienteTmp
									.getSucursal().getCodigosucursal() != null) ? clienteTmp
									.getSucursal().getCodigosucursal()
									.toString()
									: null);
					clienteDTO2
							.setCodigotipodocumento_TipoDocumento((clienteTmp
									.getTipoDocumento()
									.getCodigotipodocumento() != null) ? clienteTmp
									.getTipoDocumento()
									.getCodigotipodocumento().toString()
									: null);
					clienteDTO2.setCliente(clienteTmp);
					clienteDTO2.setClienteView(this);
					clienteDTO.add(clienteDTO2);
				}
			}

			// Remove this Renderable from the existing render groups.
			leaveRenderGroups();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate. If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<ClienteDTO>(totalNumberCliente, startRow,
				clienteDTO);
	}

	protected boolean isDefaultAscending(String sortColumn) {
		return true;
	}

	/**
	 * This method is called when a render call is made from the server. Render
	 * calls are only made to views containing an updated record. The data is
	 * marked as dirty to trigger a fetch of the updated record from the
	 * database before rendering takes place.
	 */
	public PersistentFacesState getState() {
		onePageDataModel.setDirtyData();

		return state;
	}

	/**
	 * This method is called from faces-config.xml with each new session.
	 */
	public void setRenderManager(RenderManager renderManager) {
		this.renderManager = renderManager;
	}

	public void renderingException(RenderingException arg0) {
		if (arg0 instanceof TransientRenderingException) {
		} else if (arg0 instanceof FatalRenderingException) {
			// Remove from existing Customer render groups.
			leaveRenderGroups();
		}
	}

	/**
	 * Remove this Renderable from existing uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void leaveRenderGroups() {
		if (Utilities.validationsList(clienteDTO)) {
			for (ClienteDTO clienteTmp : clienteDTO) {
				renderManager.getOnDemandRenderer("ClienteView").remove(this);
			}
		}
	}

	/**
	 * Add this Renderable to the new uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void joinRenderGroups() {
		if (Utilities.validationsList(clienteDTO)) {
			for (ClienteDTO clienteTmp : clienteDTO) {
				renderManager.getOnDemandRenderer("ClienteView").add(this);
			}
		}
	}

	public void dispose() throws Exception {
	}

	public RenderManager getRenderManager() {
		return renderManager;
	}

	public void setState(PersistentFacesState state) {
		this.state = state;
	}

	public HtmlInputText getTxtApellidocliente() {
		return txtApellidocliente;
	}

	public void setTxtApellidocliente(HtmlInputText txtApellidocliente) {
		this.txtApellidocliente = txtApellidocliente;
	}

	public HtmlInputText getTxtCorreo() {
		return txtCorreo;
	}

	public void setTxtCorreo(HtmlInputText txtCorreo) {
		this.txtCorreo = txtCorreo;
	}

	public HtmlInputText getTxtDireccion() {
		return txtDireccion;
	}

	public void setTxtDireccion(HtmlInputText txtDireccion) {
		this.txtDireccion = txtDireccion;
	}

	public HtmlInputText getTxtNombrecliente() {
		return txtNombrecliente;
	}

	public void setTxtNombrecliente(HtmlInputText txtNombrecliente) {
		this.txtNombrecliente = txtNombrecliente;
	}

	public HtmlInputText getTxtTelefono() {
		return txtTelefono;
	}

	public void setTxtTelefono(HtmlInputText txtTelefono) {
		this.txtTelefono = txtTelefono;
	}

	public HtmlInputText getTxtCodigoestado_Estado() {
		return txtCodigoestado_Estado;
	}

	public void setTxtCodigoestado_Estado(HtmlInputText txtCodigoestado_Estado) {
		this.txtCodigoestado_Estado = txtCodigoestado_Estado;
	}

	public HtmlSelectOneMenu getCbmSucursal() {
		try {
    		List<Sucursal> list = BusinessDelegatorView.getSucursal();
    		listSucursal.clear();
    		listSucursal.add(new SelectItem(0,"Seleccione un valor"));
    		
    		for (Sucursal sucursal : list) {
    			listSucursal.add(new SelectItem(sucursal.getCodigosucursal(), sucursal.getNombresucursal()));
			}
		} catch (Exception e) {
		}
		return cbmSucursal;
	}

	public void setCbmSucursal(HtmlSelectOneMenu cbmSucursal) {
		this.cbmSucursal = cbmSucursal;
	}

	public List<SelectItem> getListSucursal() {
		return listSucursal;
	}

	public void setListSucursal(List<SelectItem> listSucursal) {
		this.listSucursal = listSucursal;
	}

	public HtmlInputText getTxtCodigosucursal_Sucursal() {
		return txtCodigosucursal_Sucursal;
	}

	public void setTxtCodigosucursal_Sucursal(
			HtmlInputText txtCodigosucursal_Sucursal) {
		this.txtCodigosucursal_Sucursal = txtCodigosucursal_Sucursal;
	}

	public HtmlSelectOneMenu getTxtCodigotipodocumento_TipoDocumento() {
		try {
			list_tipos.clear();
			tipos = BusinessDelegatorView.getTipoDocumento();
			SelectItem item = new SelectItem(0,
					"Seleccione un tipo de documento");
			list_tipos.add(item);
			for (TipoDocumento documento : tipos) {
				item = new SelectItem(documento.getCodigotipodocumento(),
						documento.getNombretipodocumento());
				list_tipos.add(item);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return txtCodigotipodocumento_TipoDocumento;
	}

	public void setTxtCodigotipodocumento_TipoDocumento(
			HtmlSelectOneMenu txtCodigotipodocumento_TipoDocumento) {
		this.txtCodigotipodocumento_TipoDocumento = txtCodigotipodocumento_TipoDocumento;
	}

	public HtmlInputText getTxtCedulacliente() {
		return txtCedulacliente;
	}

	public void setTxtCedulacliente(HtmlInputText txtCedulacliente) {
		this.txtCedulacliente = txtCedulacliente;
	}

	public HtmlCommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(HtmlCommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public HtmlCommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(HtmlCommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public HtmlCommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(HtmlCommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public HtmlCommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(HtmlCommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public List<SelectItem> getList_tipos() {
		return list_tipos;
	}

	public void setList_tipos(List<SelectItem> listTipos) {
		list_tipos = listTipos;
	}

	public List<TipoDocumento> getTipos() {
		return tipos;
	}

	public void setTipos(List<TipoDocumento> tipos) {
		this.tipos = tipos;
	}

	public HtmlCommandButton getBtnLupa() {
		return btnLupa;
	}

	public void setBtnLupa(HtmlCommandButton btnLupa) {
		this.btnLupa = btnLupa;
	}

	public Boolean getPopupVisible() {
		return popupVisible;
	}

	public void setPopupVisible(Boolean popupVisible) {
		this.popupVisible = popupVisible;
	}

	public HtmlCommandLink getCmlSucursal() {
		return cmlSucursal;
	}

	public void setCmlSucursal(HtmlCommandLink cmlSucursal) {
		this.cmlSucursal = cmlSucursal;
	}

	public HtmlOutputText getCmlCliente() {
		return cmlCliente;
	}

	public void setCmlCliente(HtmlOutputText cmlCliente) {
		this.cmlCliente = cmlCliente;
	}

	public List<Sucursal> getDataSucursales() {
		return dataSucursales;
	}

	public void setDataSucursales(List<Sucursal> dataSucursales) {
		this.dataSucursales = dataSucursales;
	}

	public void setRenderDataTable(boolean renderDataTable) {
		this.renderDataTable = renderDataTable;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

	public List<ClienteDTO> getClienteDTO() {
		return clienteDTO;
	}

	public void setClienteDTO(List<ClienteDTO> clienteDTO) {
		this.clienteDTO = clienteDTO;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	/**
	 * A special type of JSF DataModel to allow a datatable and datapaginator to
	 * page through a large set of data without having to hold the entire set of
	 * data in memory at once. Any time a managed bean wants to avoid holding an
	 * entire dataset, the managed bean declares this inner class which extends
	 * PagedListDataModel and implements the fetchData method. fetchData is
	 * called as needed when the table requires data that isn't available in the
	 * current data page held by this object. This requires the managed bean
	 * (and in general the business method that the managed bean uses) to
	 * provide the data wrapped in a DataPage object that provides info on the
	 * full size of the dataset.
	 */
	private class LocalDataModel extends PagedListDataModel {
		public LocalDataModel(int pageSize) {
			super(pageSize);
		}

		public DataPage<Cliente> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPage(startRow, pageSize);
		}
	}

	private class LocalDataModelDTO extends PagedListDataModel {
		public LocalDataModelDTO(int pageSize) {
			super(pageSize);
		}

		public DataPage<ClienteDTO> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPageDTO(startRow, pageSize);
		}
	}
}
